/**
 * 上海中赢金融信息服务有限公司
 * Copyright (c) 2017-2027 Chinazyjr,Inc.All Rights Reserved.
 */
package com.sys.midware.mongo.core.handler;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.LinkedBlockingQueue;

import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.sys.midware.mongo.core.MongoColumnAttr;
import com.sys.midware.mongo.core.index.MongoIndex;
import com.sys.midware.mongo.core.mongoOP.MongoPage;
import com.sys.midware.mongo.core.mongoOP.MongoQuery;
import com.sys.midware.mongo.core.mongoOP.MongoSort;
import com.sys.midware.mongo.core.mongoOP.MongoUpdate;
import com.sys.midware.mongo.exceptions.MongoDALException;

/**
 * 
 * <b>ClassName：</b> DBHandler <br/>
 * <b>Description：</b> MongoDB访问数据库的句柄对象 <br/>
 * <b>@author：</b> mobing <br/>
 * <b>@date：</b> 2016年1月7日 上午10:49:02 <br/>
 * <b>@version: </b> <br/>
 */
public interface IMongoDBHandler {
    /**
     * 获取当前实例下所有数据库名称
     * @param  
     * @return  List<String>
     */
    public List<String> getAllDataBaseNames();
    public DBCollection getDBCollection(String name) throws MongoDALException;
    /**
     * 打开数据库
     */
    public DB openDatabase() throws MongoDALException;
    /**
     * 打开数据库
     */
    public DB openDatabase(String databaseName) throws MongoDALException;

    /**
     * 删除数据库
     */
    public void dropDatabase() throws MongoDALException;

    /**
     * 获取数据库名
     * 
     */
    public String getDatabaseName();

    /**
     * 获取此数据库中的所有表
     */
    public Collection<String> getAllCollections() throws MongoDALException;

    /**
     * 检测指定的表是否存在于DB中
     * 
     * @param tableName
     *            表名
     * @return true表示表存在；否则false
     */
    public boolean checkTableExist(String collectionName) throws MongoDALException;

    /**
     * 在此数据库中创建一张数据表
     * 
     * @param tableName
     *            表明
     * @param columnMap
     *            表字段的集合，key为字段名称，value为字段类型的描述
     * @throws MongoDALException
     */
    public void performCreate(String collectionName, Map<String, MongoColumnAttr> columnMap) throws MongoDALException;

    /**
     * 删除数据库中的一个表
     * 
     * @param tableName
     *            表名
     */
    public void performDrop(String collectionName) throws MongoDALException;

    /**
     * 创建组合索引
     * 
     * @param indexName
     * @param tableName
     * @param description
     */
    public void performAddIndex(String collectionName, DBObject index) throws MongoDALException;

    public void performAddIndex(String collectionName, MongoIndex index) throws MongoDALException;
    
    /**
     * 向指定的表中插入数据
     * 
     * @param tableName
     *            表名
     * @param parameterMap
     *            插入的字段名以及其对应的值（key为字段名称，value为字段值）
     * @throws MongoDALException
     */
    public void performInsert(String collectionName, Object obj) throws MongoDALException;

    /**
     * 向指定的表中批量插入数据
     * 
     * @param tableName
     *            表名
     * @param records
     *            记录集合，每个集合包含插入的字段名以及其对应的值（key为字段名称，value为字段值）
     * @throws MongoDALException
     */
    public void performBatchInsert(String collectionName, Collection<?> records) throws MongoDALException;

    /**
     * 在指定的表中更新数据
     * 
     * @param tableName
     *            表名
     * @param parameterMap
     *            更新的字段名以及其对应的值（key为字段名称，value为字段值）
     * @param updateCondition
     *            更新条件
     * @param upMulti
     *            是否更新所有满足条件的记录；true, 更新所有记录; false, 仅更新第一条记录
     * @param upsert
     *            当更新条件不满足时，是否插入此条记录；true, 插入此新记录; false, 不插入
     * @throws MongoDALException
     */
    public int performUpdate(String collectionName, MongoUpdate setFields, MongoQuery whereFields, boolean upMulti,
            boolean upsert) throws MongoDALException;

    /**
     * 在指定的表中更新数据
     * 
     * @param tableName
     *            表名
     * @param setFields
     *            更新的字段名以及其对应的值（key为字段名称，value为字段值）
     * @param whereFields
     *            更新条件
     * @throws MongoDALException
     */
    public int performUpdate(String collectionName, MongoUpdate setFields, MongoQuery whereFields)
            throws MongoDALException;

    /**
     * 在指定的表中删除数据
     * 
     * @param tableName
     *            表名
     * @param deleteCondition
     *            删除条件
     * @throws MongoDALException
     * @return int 返回删除成功的记录数
     */
    public int performDelete(String collectionName, MongoQuery whereFields) throws MongoDALException;

    /**
     * 查询一个
     */
    public <T extends Object> Object find(String collectionName, MongoQuery paramObj, Class<T> beanClazz)
            throws MongoDALException;

    /**
     * 在指定的表中查询数据
     * 
     * @param tableName
     *            表名
     * @param queryCondition
     *            查询条件
     * @param sortCondition
     *            排序条件，若为null，则不排序
     * @param limit
     *            要返回的记录个数；若小于0，则表示返回所有记录
     * @return 查询结果
     * @throws MongoDALException
     */

    public  Collection<?> performQuery(String collectionName, MongoQuery queryCondition, int limit, Class<?> beanClazz)
            throws MongoDALException;
    /**
     * 在指定的表中查询数据，并返回指定个数的记录，每个记录包含指定的字段
     * @param tableName
     *            表名
     * @param queryCondition
     *            查询条件
     * @param keys
     *            要返回的字段集合；若设置为null，则表示返回所有字段
     * @param sortCondition
     *            排序条件，若为null，则不排序
     * @param limit
     *            要返回的记录个数；若小于0，则表示返回所有记录
     * @return 包含返回字段的查询结果
     */
    public Collection<?> performQuery(String collectionName, MongoQuery queryCondition, MongoSort sortCondition,
            int limit, Class<?> beanClazz) throws MongoDALException;

    public Collection<?> performQuery(String collectionName, MongoQuery queryCondition, int pageNo, int pageSize,
            Class<?> beanClazz) throws MongoDALException;

    public Collection<?> performQuery(String collectionName, Map<String, Object> columns, MongoQuery queryCondition,
            MongoPage mongoPage, Class<?> beanClazz) throws MongoDALException;
    
    public void performQuery(String collectionName, Map<String, Object> columns, MongoQuery queryCondition,
            MongoPage mongoPage,Class<?> beanClazz, LinkedBlockingQueue<Map<String,Object>> queue) throws MongoDALException;

    /**
     * 获取指定表的记录总数
     * 
     * @param tableName
     *            表名
     * @return
     */
    public long count(String collectionName);

    /**
     * 获取指定表、指定条件的记录总数
     * 
     * @param tableName
     * @param queryCondition
     * @return
     */
    public long findCountBy(String collectionName, MongoQuery queryCondition);
}
